package com.holly.unit.gen.api.util;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * 类描述: 模板语言工具类
 *
 * @author fxr
 * @version 1.0.0
 * @date 2022/1/14 10:07
 */
@Slf4j
public class FreemarkerUtil {


    /***
     * 初始化freemarker 的配置对象
     * @param templateRootDirs 模板路径
     * @param encode 编码
     * @return
     */
    public static Configuration initConf(List<File> templateRootDirs, String encode) throws IOException{

        Configuration conf = new Configuration(Configuration.VERSION_2_3_28);

        FileTemplateLoader[] loaders = new FileTemplateLoader[templateRootDirs.size()];

        for (int i = 0; i < templateRootDirs.size(); i++) {
            File file = templateRootDirs.get(i);
            loaders[i] = new FileTemplateLoader(file);
        }

        MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(loaders);
        conf.setTemplateLoader(multiTemplateLoader);
        conf.setNumberFormat("###############");
        conf.setBooleanFormat("true,false");
        conf.setDefaultEncoding(encode);
        return conf;
    }

    /***
     * 把字符串分割为数组
     * StringTokenizer的分隔符不需要使用转义字符
     * String.Split（）使用正则表达式，而StringTokenizer的只是使用逐字分裂的字符。
       如果不用正则表达式（StringTokenizer也不能使用正则表达式），StringTokenizer在截取字符串中的效率最高。
     * @param str 字符串
     * @param seperators 分割规则
     * @return
     */
    public static String[] strToArray(String str,String seperators) {
        if (str == null) return new String[0];
        // StringTokenizer是一个用来分隔String的应用类
        StringTokenizer tokenizer = new StringTokenizer(str,seperators);
        List<String> res = new ArrayList<>();
        while (tokenizer.hasMoreElements()) {
            res.add(tokenizer.nextElement().toString());
        }

        return res.toArray(new String[res.size()]);
    }


    /***
     * 根据map数据源填充模板内容
     * @param tempStr 模板
     * @param map 数据源
     * @param cfg freemarker配置对象
     * @return
     */
    public static String generatorTmplateStr(String tempStr, Map<String,Object> map, Configuration cfg) {
        StringWriter writer = new StringWriter();
        try {
            Template template = new Template("tempStr",new StringReader(tempStr),cfg);
            template.process(map,writer);
            return writer.toString();
        }catch (Exception e) {
            throw new IllegalStateException("can not generator tempStr:"+tempStr+" case:"+e,e);
        }
    }

    public static void generatorTemplate(Template template,Map<String,Object> map,
                                         File outFilePath,String encod) throws IOException,TemplateException{

        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFilePath),encod));
        map.put("Format",new FreemarkerFormatUtil());
        template.process(map,out);
        out.close();


    }

















}
